From 77cf55f0b8964f4d82d7119bfe59db8fddf4b320 Mon Sep 17 00:00:00 2001 From: "akw27@boulderdash.cl.cam.ac.uk" Date: Fri, 14 Feb 2003 14:22:22 +0000 Subject: [PATCH] bitkeeper revision 1.22.1.14 (3e4cfb9e8kov7wBkpF_IkW4uJSFJYw) Extraneous interrupt removal. --- .../include/hypervisor-ifs/hypervisor-if.h | 11 ------ xen-2.4.16/net/dev.c | 14 +++++-- .../arch/xeno/drivers/network/network.c | 39 +++++++++---------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h index a0cfc7ae59..2d6b84e83e 100644 --- a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h +++ b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h @@ -108,13 +108,6 @@ typedef struct #define EVENT_DIE 0x08 /* OS is about to be killed. Clean up please! */ #define EVENT_NET_TX 0x10 /* packets for transmission. */ #define EVENT_NET_RX 0x20 /* empty buffers for receive. */ -#define EVENT_NET2_TX 0x40 /* packets for transmission. */ -#define EVENT_NET2_RX 0x80 /* empty buffers for receive. */ - -/* should these macros and the ones below test for range violation? */ -#define EVENT_NET_TX_FOR_VIF(x) (EVENT_NET_TX << (2 * x)) -#define EVENT_NET_RX_FOR_VIF(x) (EVENT_NET_RX << (2 * x)) - /* Bit offsets, as opposed to the above masks. */ #define _EVENT_BLK_TX 0 @@ -123,11 +116,7 @@ typedef struct #define _EVENT_DIE 3 #define _EVENT_NET_TX 4 #define _EVENT_NET_RX 5 -#define _EVENT_NET2_TX 6 -#define _EVENT_NET2_RX 7 -#define _EVENT_NET_TX_FOR_VIF(x) (_EVENT_NET_TX + (2 * x)) -#define _EVENT_NET_RX_FOR_VIF(x) (_EVENT_NET_RX + (2 * x)) /* * NB. We expect that this struct is smaller than a page. diff --git a/xen-2.4.16/net/dev.c b/xen-2.4.16/net/dev.c index 39bd6699af..0e19d7a0a6 100644 --- a/xen-2.4.16/net/dev.c +++ b/xen-2.4.16/net/dev.c @@ -40,6 +40,12 @@ #define rtnl_unlock() ((void)0) #define dst_init() ((void)0) +#if 1 +#define DPRINTK(_f, _a...) printk(_f , ## _a) +#else +#define DPRINTK(_f, _a...) ((void)0) +#endif + // Ring defines: #define TX_RING_INC(_i) (((_i)+1) & (TX_RING_SIZE-1)) #define RX_RING_INC(_i) (((_i)+1) & (RX_RING_SIZE-1)) @@ -1005,7 +1011,7 @@ void update_shared_ring(void) __flush_tlb(); if ( net_ring->rx_cons == net_ring->rx_event ) - set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events); + set_bit(_EVENT_NET_RX, &s->events); } } @@ -1153,7 +1159,7 @@ void flush_rx_queue(void) } net_ring->rx_cons = (i+1) & (RX_RING_SIZE-1); if ( net_ring->rx_cons == net_ring->rx_event ) - set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events); + set_bit(_EVENT_NET_RX, &s->events); } kfree_skb(skb); } @@ -2222,14 +2228,14 @@ long do_net_update(void) if ( ((tx.addr & ~PAGE_MASK) + tx.size) >= PAGE_SIZE ) { - printk("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size, + DPRINTK("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size, (tx.addr &~PAGE_MASK) + tx.size); continue; //BUG(); } if ( TX_RING_INC(i) == net_ring->tx_event ) - set_bit(_EVENT_NET_TX_FOR_VIF(j), &shared->events); + set_bit(_EVENT_NET_TX, &shared->events); /* Map the skb in from the guest, and get it's delivery target. * We need this to know whether the packet is to be sent locally diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c index eef4f2dae6..87b1a97fdc 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c @@ -27,9 +27,6 @@ #define NET_TX_IRQ _EVENT_NET_TX #define NET_RX_IRQ _EVENT_NET_RX -#define NET_TX_IRQ_FOR_VIF(x) _EVENT_NET_TX_FOR_VIF(x) -#define NET_RX_IRQ_FOR_VIF(x) _EVENT_NET_RX_FOR_VIF(x) - #define TX_MAX_ENTRIES (TX_RING_SIZE - 2) #define RX_MAX_ENTRIES (RX_RING_SIZE - 2) @@ -76,15 +73,7 @@ static int network_open(struct net_device *dev) { struct net_private *np = dev->priv; int error = 0; - char *rxlabel, *txlabel; - - // This is inevitably not the right way to allocate a couple of static strings. - rxlabel = kmalloc(sizeof("net-rx- "), GFP_KERNEL); - txlabel = kmalloc(sizeof("net-tx- "), GFP_KERNEL); - if ((rxlabel == NULL) || (txlabel == NULL)) goto fail; - sprintf(rxlabel, "net-rx-%d", np->id); - sprintf(txlabel, "net-tx-%d", np->id); - + np->rx_idx = np->tx_idx = np->tx_full = 0; memset(&np->stats, 0, sizeof(np->stats)); @@ -116,8 +105,8 @@ static int network_open(struct net_device *dev) network_alloc_rx_buffers(dev); - error = request_irq(NET_RX_IRQ_FOR_VIF(np->id), network_rx_int, 0, - rxlabel, dev); + error = request_irq(NET_RX_IRQ, network_rx_int, 0, + "net-rx", dev); if ( error ) { printk(KERN_WARNING "%s: Could not allocate receive interrupt\n", @@ -125,13 +114,13 @@ static int network_open(struct net_device *dev) goto fail; } - error = request_irq(NET_TX_IRQ_FOR_VIF(np->id), network_tx_int, 0, - txlabel, dev); + error = request_irq(NET_TX_IRQ, network_tx_int, 0, + "net-tx", dev); if ( error ) { printk(KERN_WARNING "%s: Could not allocate transmit interrupt\n", dev->name); - free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev); + free_irq(NET_RX_IRQ, dev); goto fail; } @@ -144,8 +133,6 @@ static int network_open(struct net_device *dev) return 0; fail: - if ( rxlabel ) kfree(rxlabel); - if ( txlabel ) kfree(txlabel); if ( np->net_ring->rx_ring ) kfree(np->net_ring->rx_ring); if ( np->net_ring->tx_ring ) kfree(np->net_ring->tx_ring); if ( np->rx_skb_ring ) kfree(np->rx_skb_ring); @@ -293,6 +280,16 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev) //print_range(skb->data + ETH_HLEN + 8, 20); //printk("skb->len is %u in guestOS (expected fraglen: %u).\n", skb->len, skb->len - (ETH_HLEN + 8)); i = np->net_ring->tx_prod; + + if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE ) + { + struct sk_buff *new_skb = alloc_skb(RX_BUF_SIZE, GFP_KERNEL); + skb_put(new_skb, skb->len); + memcpy(new_skb->data, skb->data, skb->len); + kfree_skb(skb); + skb = new_skb; + } + np->tx_skb_ring[i] = skb; np->net_ring->tx_ring[i].addr = (unsigned long)phys_to_machine(virt_to_phys(skb->data)); @@ -387,8 +384,8 @@ int network_close(struct net_device *dev) struct net_private *np = dev->priv; netif_stop_queue(dev); - free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev); - free_irq(NET_TX_IRQ_FOR_VIF(np->id), dev); + free_irq(NET_RX_IRQ, dev); + free_irq(NET_TX_IRQ, dev); network_free_rx_buffers(dev); kfree(np->net_ring->rx_ring); kfree(np->net_ring->tx_ring); -- 2.30.2